package com.hjyang.solr.util;

import com.hjyang.solr.entity.SolrFile;
import org.apache.solr.client.solrj.SolrQuery;
import org.apache.solr.client.solrj.SolrServerException;
import org.apache.solr.client.solrj.impl.HttpSolrClient;
import org.apache.solr.client.solrj.response.QueryResponse;
import org.apache.solr.client.solrj.response.UpdateResponse;
import org.apache.solr.common.SolrDocument;
import org.apache.solr.common.SolrDocumentList;
import org.apache.solr.common.SolrInputDocument;

import java.io.IOException;
import java.util.List;

/**
 * @author hjyang11
 * @date 2019/10/10
 */
public class SolrUtil {
    // 指定solr服务器的地址
    public final static String SOLR_URL = "http://localhost:8983/solr/";
    // 指定solr core
    public final static String SOLR_CORE = "fireTune/";
    
    /**
     * http://localhost:8983/solr/cFile/dataimport?command=full-import
     * http://localhost:8983/solr/cFile/dataimport?command=status
     * @param args
     * @throws Exception
     */
    public static void main(String[] args) throws Exception {
        //SolrInputDocument document = new SolrInputDocument();
        ////在客户端这边添加的字段必须在服务端中有过定义
        //document.addField("id", "aaaaaaaaaaaa");
        //document.addField("accident_id", "");
        //document.addField("accident_name", "");
        //document.addField("sggk_qhsj", "2019-02-01");
        //document.addField("sggk_qhdd", "哈尔滨");
        //document.addField("sggk_swrs", "333");
        //document.addField("sggk_ssrs", "444");
        //document.addField("sggk_jjss", "555");
        //document.addField("sggk_ghmj", "666");
        //document.addField("qhjz_qhzt", "777");
        //document.addField("accident_status", "888");
        //document.addField("org_code", "999");
        //document.addField("create_user_id", "2332323");
        //document.addField("modified_user_id", "2232332");
        //document.addField("accident_index_content", "测试搜索");
        //addDoc(document);
        
        
        //// 索引库增加/修改文档（solr 更新操作就是对相同id的文档重新添加一次）
        //SolrInputDocument document = new SolrInputDocument();
        ////在客户端这边添加的字段必须在服务端中有过定义
        //document.addField("id", "doc-file2");
        //document.addField("size", "10242");
        //document.addField("filePath", "/solrPath2");
        //document.addField("text", "/solrText3");// 相同id新增会覆盖内容
        //document.addField("lastModified", new Date());
        //addDoc(document);
        
        // 索引库删除文档
        //deleteDocumentById("22222");
        
        //// 索引库查询文档
        //SolrQuery query = new SolrQuery();
        //// 设置solr查询参数   query.set("q", "*:*");// 参数q  *:*：查询所有
        //query.set("q", "text:中国"); //查询 text 关键字中含有 中 国
        //// 参数fq：增加过滤查询条件
        ////query.addFilterQuery("id:[0 TO 9]");//id为0-4
        //// 增加布尔过滤条件
        ////query.addFilterQuery("text:中国");//text字段中含有 中国 两字的数据
        //// 参数df：设置默认搜索域
        ////query.set("df", "name");
        //// 参数sort：设置返回结果的排序规则
        ////query.setSort("id", SolrQuery.ORDER.desc);
        ////设置分页参数
        //query.setStart(0);
        //query.setRows(50);
        //// 参数hl,设置高亮
        ////query.setHighlight(true);
        //// 设置高亮的字段
        ////query.addHighlightField("name");
        ////设置高亮的样式
        ////query.setHighlightSimplePre("<font color='red'>");
        ////query.setHighlightSimplePost("</font>");
        //querySolr(query);
    
    }
    
    /**
     * 创建 SolrServer 对象
     * 该对象有两个可以使用，都是线程安全的
     * 1、CommonsHttpSolrServer：启动web服务器使用的，通过http请求的。
     * 2、EmbeddedSolrServer：内嵌式的，导入solr的jar包就可以使用了。
     * 3、solr 4.0之后好像添加了不少东西，其中CommonsHttpSolrServer这个类改名为 HttpSolrClient。
     *
     * @return
     */
    public static HttpSolrClient createSolrServer(String url, String core) {
        HttpSolrClient solr = null;
        solr = new HttpSolrClient.Builder(url + core).withConnectionTimeout(10000).withSocketTimeout(60000).build();
        return solr;
    }
    
    /**
     * 索引库添加文档
     *
     * @param document
     * @return
     */
    public static boolean addDoc(SolrInputDocument document) {
        HttpSolrClient solrClient = createSolrServer(SOLR_URL, SOLR_CORE);
        try {
            solrClient.add(document);
            UpdateResponse response = solrClient.commit();
            System.out.println(response.toString());
            solrClient.close();
            return true;
        } catch (SolrServerException e) {
            e.printStackTrace();
            return false;
        } catch (IOException e) {
            e.printStackTrace();
            return false;
        }
    }
    
    /**
     * 根据 id 从索引库删除文档
     *
     * @param id
     */
    public static boolean deleteDocumentById(String id) {
        HttpSolrClient solrClient = createSolrServer(SOLR_URL, SOLR_CORE);
        try {
            solrClient.deleteById(id);
            UpdateResponse response = solrClient.commit();
            System.out.println(response.toString());
            solrClient.close();
            return true;
        } catch (SolrServerException e) {
            e.printStackTrace();
            return false;
        } catch (IOException e) {
            e.printStackTrace();
            return false;
        }
    }
    
    /**
     * 索引库查询文档
     *
     * @throws Exception
     */
    public static boolean querySolr(SolrQuery query) {
        HttpSolrClient solrClient = createSolrServer(SOLR_URL, SOLR_CORE);
        // 获取查询结果
        QueryResponse response = null;
        try {
            response = solrClient.query(query);
        } catch (SolrServerException e) {
            e.printStackTrace();
            return false;
        } catch (IOException e) {
            e.printStackTrace();
            return false;
        }
        
        // 两种结果获取：得到文档集合或者实体对象
        // 查询得到文档的集合
        SolrDocumentList solrDocumentList = response.getResults();
        System.out.println("通过文档集合获取查询的结果--结果总数量：" + solrDocumentList.getNumFound());
        for (SolrDocument doc : solrDocumentList) {
            System.out.println("-- id:" + doc.get("id") + " -- filePath:" + doc.get("filePath"));
        }
        // 得到实体对象
        List<SolrFile> solrFileList = response.getBeans(SolrFile.class);
        if (solrFileList != null && solrFileList.size() > 0) {
            System.out.println("通过实体对象获取查询的结果：");
            for (SolrFile per : solrFileList) {
                System.out.println("-- id:" + per.getId() + " -- filePath:" + per.getFilePath());
            }
        }
        return true;
    }
}
